﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using loginSQL.SQLHelper;

namespace loginSQL.Util
{
    public class Users
    {
        public string id;
        public string nomor; //oke
        public string nama_pemegang;//oke
        public string tempat_tanggal_lahir;//oke
        public string kebangsaan;//oke
        public string jenis_kelamin;//oke
        public string alamat;//oke
        public string handphone;//oke
        public string email;//oke
        public string tanda_pengenal;//oke
        public string lisensi;//oke
        public string directur_name;//oke
        public string directur_nip;//oke

        //--------------TAMBAHAN DATA UNTUK DATA SOURCE---------------
        //active license id
        public int active_license_id;
        
        

        //tambahan untuk data tanggal
        public string tanggal_pengeluaran;
        public string tanggal_berlaku_hingga;

        //tambahan data untuk tabel perpanjangan
        public string perpanjangan_diperpanjang_sampai_dengan;
        public string perpanjangan_tanggal;

        //tambahan data untuk tabel klasifikasi rating
        public string klasifikasi_rating_jenis_kewenangan;
        public string klasifikasi_rating_berlaku_hingga;

        //tambahan data untuk perpanjangan rating
        public string perpanjangan_rating_jenis_kewenangan;
        public string perpanjangan_rating_berlaku_hingga;

        //tambahan data untuk komen
        public string comments;

        public const int PERPANJANGAN_HINGGA=12;
        public const int PERPANJANGAN_TANGGAL = 13;
        public const int KLASIFIKASI_KEWENANGAN = 14;
        public const int KLASIFIKASI_HINGGA = 15;
        public const int PERPANJANGAN_RATING_KEWENANGAN = 16;
        public const int PERPANJANGAN_RATING_HINGGA = 17;
        public const int COMMENTS = 18;

        public List<License> licenses = new List<License>();

        public static readonly String[] FieldName =new String[]{
                                       //"ID",
                                       "Nomor",
                                       "Nama Pemegang",
                                       "Tempat Tanggal Lahir",
                                       "Kebangsaan",
                                       "Jenis Kelamin",
                                       "Alamat",
                                       "Handphone",
                                       "Email",
                                       "Tanda Pengenal",
                                       "Lisensi",
                                       "Tanggal Pengeluaran",
                                       "Berlaku Hingga",
                                       "Perpanjangan Diperpanjang Hingga",
                                       "Perpanjangan Tanggal",
                                       "Klasifikasi Rating Kewenangan",
                                       "Klasifikasi Rating Berlaku Hingga",
                                       "Perpanjangan Rating Kewenangan",
                                       "Perpanjangan Rating Berlaku Hingga",
                                       "Comments",
                                       "Director Name",
                                       "Director NIP"
                                  };

        public Users(string id,int active_license_id)
        {
            this.id = id;
            this.active_license_id = active_license_id;
            DBHelper dbHelper = new DBHelper();
            Dictionary<string,string> dataUser1 = dbHelper.getDataUserFromId(id);
            List<string> dataDirector = dbHelper.getDirector();
            List<List<string>> dataLicense = dbHelper.getLicense(this.id);
            fillDataUser(dataUser1);
            fillDataDirector(dataDirector);
            fillDataLicense(dataLicense);
            fillDataTableVariable();
        }

        private void fillDataTableVariable()
        {
            //isi data tanggal
            if (this.active_license_id < this.licenses.Count && active_license_id >=0)
            {
                this.tanggal_pengeluaran = this.licenses[active_license_id].tanggal_pengeluaran;
                this.tanggal_berlaku_hingga = this.licenses[active_license_id].berlaku_hingga;

                //data tabel perpanjangan
                int current_perpanjangan_print_index = this.licenses[active_license_id].current_perpanjangan_print_index;
                if (current_perpanjangan_print_index < this.licenses[active_license_id].renewals.Count)
                {
                    this.perpanjangan_diperpanjang_sampai_dengan = this.licenses[active_license_id].renewals[current_perpanjangan_print_index].renewed_until;
                    this.perpanjangan_tanggal = this.licenses[active_license_id].renewals[current_perpanjangan_print_index].date;
                }

                //data klasifikasi rating
                int current_klasifikasi_rating_print_index = this.licenses[active_license_id].current_klasifikasi_rating_print_index;
                if (current_klasifikasi_rating_print_index < this.licenses[active_license_id].ratingclassification.Count)
                {
                    this.klasifikasi_rating_jenis_kewenangan = this.licenses[active_license_id].ratingclassification[current_klasifikasi_rating_print_index].type_of_rating;
                    this.klasifikasi_rating_berlaku_hingga = this.licenses[active_license_id].ratingclassification[current_klasifikasi_rating_print_index].tanggal_berlaku;
                }
                //data perpanjangan rating
                int current_perpanjangan_rating_print_index = this.licenses[active_license_id].current_perpanjangan_rating_print_index;
                if (current_perpanjangan_rating_print_index < this.licenses[active_license_id].ratingrenewals.Count)
                {
                    this.perpanjangan_rating_jenis_kewenangan = this.licenses[active_license_id].ratingrenewals[current_perpanjangan_rating_print_index].type_of_rating;
                    this.perpanjangan_rating_berlaku_hingga = this.licenses[active_license_id].ratingrenewals[current_perpanjangan_rating_print_index].valid_until;
                }
                int current_catatan_print_index = this.licenses[active_license_id].current_catatan_print_index;
                if (current_catatan_print_index < this.licenses[active_license_id].comments.Count)
                {
                    this.comments = this.licenses[active_license_id].comments[current_catatan_print_index];
                }

            }
        }

        public String getDataFromKey(String key)
        {
            string[] fieldArray = new string[]{
                nomor,
                nama_pemegang,
                tempat_tanggal_lahir,
                kebangsaan,
                jenis_kelamin,
                alamat,
                handphone,
                email,
                tanda_pengenal,
                lisensi,
                tanggal_pengeluaran,
                tanggal_berlaku_hingga,
                perpanjangan_diperpanjang_sampai_dengan,
                perpanjangan_tanggal,
                klasifikasi_rating_jenis_kewenangan,
                klasifikasi_rating_berlaku_hingga,
                perpanjangan_rating_jenis_kewenangan,
                perpanjangan_rating_berlaku_hingga,
                comments,
                directur_name,
                directur_nip
            };
            string value = null;
            for (int i = 0; i < FieldName.Length; i++)
            {
                if (key.Equals(FieldName[i], StringComparison.OrdinalIgnoreCase))
                {
                    value = fieldArray[i];
                    break;
                }
            }
            return value;
        }

        private void fillDataDirector(List<string> dataDirector)
        {
            if (dataDirector.Count < 2)
            {
                this.directur_name = "-";
                this.directur_nip = "-";
            }
            else
            {
                this.directur_name = dataDirector[0];
                this.directur_nip = dataDirector[1];
            }
        }

        private void fillDataUser(Dictionary<string,string> data)
        {
            try
            {
                this.nomor = data["nomor"];
                nama_pemegang = data["nama_pemegang"];
                tempat_tanggal_lahir = data["tempat_tanggal_lahir"];
                kebangsaan = data["kebangsaan"];
                jenis_kelamin = data["jenis_kelamin"];
                alamat = data["alamat"];
                handphone = data["handphone"];
                email = data["email"];
                tanda_pengenal = data["tanda_pengenal"];
                lisensi = data["tanda_pengenal"];                
            }
            catch
            {

            }
            
        }

        private void fillDataLicense(List<List<string>> licenses)
        {
            foreach (List<string> list in licenses)
            {
                if (list.Count > 0)
                {
                    License license = new License(this.id, list[0], list[1], Convert.ToInt32(list[2]), Convert.ToInt32(list[3]), Convert.ToInt32(list[4]),Convert.ToInt32(list[5]));
                    this.licenses.Add(license);
                }
            }
        }



        public static bool IsPerpanjangan(string key)
        {
            return FieldName[PERPANJANGAN_HINGGA].Equals(key, StringComparison.OrdinalIgnoreCase) || FieldName[PERPANJANGAN_TANGGAL].Equals(key, StringComparison.OrdinalIgnoreCase);
        }

        public static bool IsKlasifikasiRating(string key)
        {
            return FieldName[KLASIFIKASI_HINGGA].Equals(key, StringComparison.OrdinalIgnoreCase) || FieldName[KLASIFIKASI_KEWENANGAN].Equals(key, StringComparison.OrdinalIgnoreCase);
        }

        public static bool IsPerpanjanganRating(string key)
        {
            return FieldName[PERPANJANGAN_RATING_KEWENANGAN].Equals(key, StringComparison.OrdinalIgnoreCase) || FieldName[PERPANJANGAN_RATING_HINGGA].Equals(key, StringComparison.OrdinalIgnoreCase);
        }

        public static bool IsCatatan(string key)
        {
            return FieldName[COMMENTS].Equals(key, StringComparison.OrdinalIgnoreCase);
        }
    }
}
